package com.hxk.stream;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;

/**
 * 分支合并框架（同步调用框架）
 *  ForkJoin框架有三个概念：
 *      ForkJoinPool 分支合并池子
 *      ForkJoinTask 任务，RecursiveTask是ForkJoinTask的子类
 * 本case通过传入两个数，求两数递归相加后的结果，如本例在计算从0加到100的结果
 *
 */
public class ForkJoinCase {

    public static void main(String[] args) throws Exception {

        //要操作的资源
        MyTask myTask = new MyTask(0,100);

        //打开池子
        ForkJoinPool forkJoinPool = new ForkJoinPool();

        //放入任务
        ForkJoinTask<Integer> forkJoinTask = forkJoinPool.submit(myTask);

        //获取任务结果
        System.out.println(forkJoinTask.get());

        //关闭池子
        forkJoinPool.shutdown();
    }
}

class MyTask extends RecursiveTask<Integer> {

    //要拆分的值
    private static final int FORK_VAL = 10;

    //开始值
    private int begin;

    //结束值
    private int end;

    //计算结果
    private int result;

    public MyTask(int begin, int end) {
        this.begin = begin;
        this.end = end;
    }

    @Override
    protected Integer compute() {

        if((end - begin) < FORK_VAL){
            for (int i = begin; i <= end; i++) {
                result = result + i;
            }
        }else{
             int tempVal = (end+begin)/2;
            MyTask myTask1 = new MyTask(begin, tempVal);
            myTask1.fork();//这里的fork就是在分，则就是在执行compute方法，直到分到小于FORK_VAL后不在fork
            MyTask myTask2 = new MyTask(tempVal+1, end);
            myTask2.fork();
            result = myTask1.join()+myTask2.join();
        }
        return result;
    }
}

